package priv.wangy.micro.common.utils.file;

import org.springframework.web.multipart.MultipartFile;
import priv.wangy.micro.common.utils.file.impl.BaseTypeUtil;
import priv.wangy.micro.common.utils.file.impl.ImgTypeUtil;
import priv.wangy.micro.common.utils.file.impl.OfficeTypeUtil;
import priv.wangy.micro.common.utils.file.impl.PdfTypeUtil;

import java.util.Arrays;
import java.util.Objects;
import java.util.Optional;

/**
 * 文件工厂类
 *
 * @author 张嘉琪
 * @since 2023-04-24
 */
public class FileFactory {

    public enum Code {
        /**
         * 校验类型编码
         */
        IMG("img"), PDF("pdf"), OFC("ofc"), LTD("ltd"), MTE("mte");
        private final String code;

        public String getCode() {
            return code;
        }

        Code(String code) {
            this.code = code;
        }

        static Code getTypeByCode(String code) {
            Optional<Code> first = Arrays.stream(Code.values()).filter(type -> Objects.equals(type.getCode(), code)).findFirst();
            return first.orElse(null);
        }
    }

    public static IFileTypeUtil getTypeUtil(String code) {
        Code type = Code.getTypeByCode(code);
        switch (type) {
            case IMG:
            case MTE:
                return ImgTypeUtil.getInstance();
            case PDF:
                return PdfTypeUtil.getInstance();
            case OFC:
                return OfficeTypeUtil.getInstance();
            case LTD:
                return BaseTypeUtil.getInstance();
            default:
                return null;
        }
    }

    public static boolean typeVerification(MultipartFile file, String code) {
        IFileTypeUtil util = getTypeUtil(code);
        if (Objects.nonNull(util)) {
            return util.typeVerify(file);
        }
        return false;
    }
}
